// 新建 utils/http.js 文件 导入 http 模块
import http from 'wechat-http'

/**
 * 配置接口基础路径，接口文档可获得
 */
http.baseURL = 'https://live-api.itheima.net'

// 请求拦截器
http.intercept.request = (params) => {
  // 读取全局实例中的 token
  const { token } = getApp()
  // 指定一个公共的头信息
  // 初始为空对象后续可以扩展
  const defaultHeader = {}
  // 追加 token 头信息
  if (token) defaultHeader.Authorization = token
  // 合并自定义头信息和公共头信息
  params.header = Object.assign(defaultHeader, params.header)
  // 处理后的请求参数
  return params
}

/**
 * 配置响应拦截器
 */
http.intercept.response = async ({ statusCode, data, config }) => {
  // statusCode 为状态码
  if (statusCode === 401) {
    // config 是调用接口的参数
    // refreshToken 过期的情形
    if (config.url.includes('/refreshToken')) {
      // 读取当前历史栈
      const pages = getCurrentPages()
      // 取出当前页面路径，登录成功能跳转到该页面
      const lastPage = pages[pages.length - 1]
      // console.log(lastPage.onLoad)
      // 引导用户到登录页面
      wx.redirectTo({
        url: `/pages/login/index?backTo=/${lastPage.route}`,
      })
    }

    // 如果没有refresh_token，那么说明用户没有登录，不需要刷新token因为肯定失败
    if (!getApp().refresh_token) return
    // 使用 refreshToken 更新 token
    const res = await http({
      url: '/refreshToken',
      method: 'POST',
      header: {
        // 这时要注意使用的是 refresh_token
        Authorization: getApp().refresh_token,
      },
    })

    // 更新 token 和 refresh_token
    getApp().setToken(res.data.token, res.data.refreshToken)
    // 无感刷新页面-刷新token后刷新token失效的页面
    // console.log('config', config)
    return http({
      ...config,
      header: {
        Authorization: getApp().token,
      },
    })
  }

  // 过滤接口返回的数据
  return data
}

/**
 * 挂载方法到全局
 */
wx.http = http

/**
 * 模块导出
 */
export default http
